# -*- coding: latin-1 -*-
from django.db import models
from django import forms
from tjango.calculated.calculatedfields import *
from tjango.autocomplete.autocompletefields import *
from gestion.monedas.models import *
from django.conf import settings


# app productos
class UnidadMedida(models.Model):
	nombre = models.CharField(max_length=20, unique=True)
	nombre_imprimir = models.CharField(max_length=20,blank=True,null=True)
	def __unicode__(self):
		return self.nombre
	class Meta:
		verbose_name_plural = "unidades de medida"
		verbose_name = "unidad de medida"
		ordering = ['nombre']
		
		
class Familia(models.Model):
	nombre = models.CharField(max_length=40, unique=True)
	limite_1 = models.FloatField(blank=True, null=True)
	limite_2 = models.FloatField(blank=True, null=True)
	limite_3 = models.FloatField(blank=True, null=True)
	def __unicode__(self):
		return self.nombre

class Producto(models.Model):
	nombre = models.CharField(max_length=20, unique=True)
	unidad_medida = AutocompleteField(UnidadMedida, ['nombre'])
	moneda = AutocompleteField(Moneda, ['nombre', 'simbolo'])
	familia = AutocompleteField(Familia,['nombre'])
	def ultimo_inventario(self):
		items = self.inventario.order_by('inventario__fecha')
		result = 0
		if items:
			return items[items.count()-1]
	def ultimas_compras(self):
		item = self.ultimo_inventario()
		result = 0
		for compra in self.compras.filter(models.Q(compra__fecha__gt = item.inventario.fecha) | models.Q(compra__fecha = item.inventario.fecha, compra__hora__gt = item.inventario.hora)):
			result += compra.cantidad
		return result
	
	def ultimas_ventas(self):
		item = self.ultimo_inventario()
		result = 0
		for venta in self.ventas.filter(models.Q(venta__fecha__gt = item.inventario.fecha) | models.Q(venta__fecha = item.inventario.fecha, venta__hora__gt = item.inventario.hora)).filter(models.Q(venta__anular=None) | models.Q(venta__anular=False)):
			result += venta.cantidad
		return result
	def cantidad_esperada(self):
		items = self.inventario.order_by('inventario__fecha')
		result = 0
		if items:
			item = items[items.count()-1]
			result = item.cantidad_real
			compras = self.compras.filter(models.Q(compra__fecha__gt = item.inventario.fecha) | models.Q(compra__fecha = item.inventario.fecha, compra__hora__gt = item.inventario.hora))
			ventas = self.ventas.filter(models.Q(venta__anular=None) | models.Q(venta__anular=False))
			ventas = ventas.filter(models.Q(venta__fecha__gt = item.inventario.fecha) | models.Q(venta__fecha = item.inventario.fecha, venta__hora__gt = item.inventario.hora))
			for compra in compras:
				
				result += compra.cantidad
			for venta in ventas:
				result -= venta.cantidad
				
		return result
		
	def precio_compra(self,cantidad):
		a=self.precios.order_by('listaprecio__inicio_vigencia')
		if a:
			precio = a[a.count()-1]
		
		        if  cantidad <= self.familia.limite_1:
			   return precio.precio_lim1
		        elif cantidad <= self.familia.limite_2:
			   return precio.precio_lim2
		        elif cantidad > precio.precio_lim2:
			   return precio.precio_lim3
                else:
                  return ""
		
	def precio_venta(self): 
		a=self.precios.order_by('listaprecio__inicio_vigencia')
		if a:
			return a[a.count()-1].precio_venta
		else: 
			return 0
	def __unicode__(self):
		return self.nombre
	class Meta:
		ordering = ['nombre']



class ListaPrecio(models.Model):
	inicio_vigencia = models.DateField()
	
	def __unicode__(self):
		if self.inicio_vigencia:
			return "%s" % self.inicio_vigencia.strftime(settings.DATE_OUTPUT_FORMAT)
		else:
			return ""
	
	class Meta:
		verbose_name_plural = "listas de precios"
		verbose_name = "lista de precios"
		ordering = ['-inicio_vigencia']
		
class PrecioProducto(models.Model):
	listaprecio = models.ForeignKey(ListaPrecio, related_name="items")
	producto = AutocompleteField(Producto,['nombre'], related_name="precios")
	unidad_medida = CalculatedField(source = ['producto'], server = "Producto.objects.get(id=producto).unidad_medida.nombre")
	moneda = CalculatedField(source = ['producto'], server = "Producto.objects.get(id=producto).moneda.simbolo")
	precio_lim1 = models.FloatField(blank=True,null=True)
	precio_lim2 = models.FloatField(blank=True,null=True)
	precio_lim3 = models.FloatField(blank=True,null=True)
	precio_venta = models.FloatField()
	
		

	
	def __unicode__(self):
		return "%s = %s" % (self.producto.nombre, self.precio_venta)
	class Meta:
		verbose_name_plural = "precio de productos"
		ordering = ['producto']

class Inventario(models.Model):
	fecha = models.DateField()
	hora = models.TimeField(auto_now_add=True)
	
	def __unicode__(self):
		if self.fecha:
			return "Inventario del %s" % self.fecha.strftime(settings.DATE_OUTPUT_FORMAT)
		else: return ""

class ItemInventario(models.Model):
	producto = AutocompleteField(Producto,['nombre'],related_name="inventario")
	cantidad_real = models.FloatField()
	unidad_medida = CalculatedField(source = ['producto'], server = "Producto.objects.get(id=producto).unidad_medida.nombre")
	cantidad_esperada = CalculatedField(source = ['producto'], server = "Producto.objects.get(id=producto).cantidad_esperada()")
	inventario = models.ForeignKey(Inventario,related_name="iteminv")
	def __unicode__(self):
		return "%s cantidad real:%f, unidad de medida:%s, cantidad esperada:%s" % (self.producto.nombre,self.cantidad_real,self.unidad_medida,self.cantidad_esperada)
	
	
